package com.snail.utils;

import org.springframework.stereotype.Component;
import ws.schild.jave.Encoder;
import ws.schild.jave.EncoderException;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.info.MultimediaInfo;

import java.io.File;
import java.io.IOException;

/**
 * 音频处理，将语音转文字的音频分片111
 */

@Component
public class AudioProcessingUtil {

    // 获取音频时长（毫秒）
    public long getAudioDuration(File audioFile) throws IOException {
        try {
            // 创建多媒体对象
            MultimediaObject multimediaObject = new MultimediaObject(audioFile);
            // 直接通过multimediaObject获取信息（替代Encoder的getInfo方法）
            MultimediaInfo info = multimediaObject.getInfo();
            // 返回时长（毫秒）
            return info.getDuration();
        } catch (EncoderException e) {
            throw new IOException("获取音频时长失败", e);
        }
    }

    // 使用FFmpeg分割音频
    public File splitAudio(File inputFile, long startTimeMillis, long endTimeMillis) throws IOException {
        File outputFile = File.createTempFile("segment-", ".wav");

        AudioAttributes audioAttributes = new AudioAttributes();
        audioAttributes.setCodec("pcm_s16le");
        audioAttributes.setBitRate(16000);
        audioAttributes.setChannels(1);
        audioAttributes.setSamplingRate(16000);

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setInputFormat("wav");
        attrs.setAudioAttributes(audioAttributes);
        attrs.setOffset((float) (startTimeMillis / 1000.0));
        attrs.setDuration((float) ((endTimeMillis - startTimeMillis) / 1000.0));

        Encoder encoder = new Encoder();
        try {
            encoder.encode(new MultimediaObject(inputFile), outputFile, attrs);
            return outputFile;
        } catch (EncoderException e) {
            outputFile.delete();
            throw new IOException("分割音频失败", e);
        } finally {
            // 假设Encoder没有close方法，否则应在此调用
            // 如果有资源需要释放，建议查阅Encoder文档或手动处理
        }
    }

}